
#ifndef __WS2812B_H
#define __WS2812B_H

#include "stm32f10x.h"                  // Device header

/* WS2812B有多种驱动方式，以下提供了三种，每一种单独拿出来都是可行的 */
/* 驱动模式选择(0:nop延时实现(若效果不好可根据调整__NOP()的数量来调节)，1:PWM实现，2:PWM+DMA实现) */
#define     WS2812B_DRIVER_MODE     (0)

/* WS2812B灯珠个数 */
#define     WS2812B_NUM     (12)

/* WS2812B端口引脚及复用功能定义 */
// GPIO(可根据实际的引脚修改)
#define     WS2812B_GPIO_RCC_ENABLE()   (RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE))  // 端口时钟使能
#define     WS2812B_PORT                (GPIOA)                                     // 端口
#define     WS2812B_PIN                 (GPIO_Pin_6)                                // 引脚
#define     WS2812B_LOW                 (WS2812B_PORT->BSRR = WS2812B_PIN << 16)    // 输出低电平
#define     WS2812B_HIGH                (WS2812B_PORT->BSRR = WS2812B_PIN)          // 输出高电平
// 定时器(若使用驱动模式0则不用管以下定义)
#define     WS2812B_TIM_RCC_ENABLE()    (RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB2Periph_AFIO, ENABLE)) // 定时器时钟使能及端口复用使能
#define     WS2812B_TIMER_TYPE          (1)                     // 定时器类型(0:通用定时器，1:高级定时器)
#define     WS2812B_TIM                 (TIM3)                  // 定时器
#define     WS2812B_TIM_CH              CCR1                    // 通道
#define     WS2812B_TIM_OCInit          TIM_OC1Init             // 对应通道的初始化
#define     WS2812B_TIM_OCPreloadConfig TIM_OC1PreloadConfig    // 配置预装载
#define     WS2812B_TIM_ARR             (72000000/800000 - 1)   // 定时器自动重装值(PWM频率固定800kHz，APB1总线上定时器的为72MHz/800kHz-1，APB2总线上定时器的为36MHz/800kHz-1)
#define     WS2812B_TIM_ARR_CODE0       (25)                    // 0码对应的PWM自动重装值(计算公式：(TIMx->ARR+1) * 0.28，可能稍有偏差，若发现现象不对可小幅度加减一点)
#define     WS2812B_TIM_ARR_CODE1       (65)                    // 1码对应的PWM自动重装值(计算公式：(TIMx->ARR+1) * 0.72，可能稍有偏差，若发现现象不对可小幅度加减一点)
// DMA(若使用驱动模式0或1则不用管以下定义，另外注意，暂时发现并不是所有的定时器配置DMA后都能正常使用，若没有效果可更换定时器试试)
#define     WS2812B_DMA_RCC_ENABLE()    (RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE)) // DMA时钟使能
#define     WS2812B_DMA_CH              (DMA1_Channel6)         // DMA通道
#define     WS2812B_DMA_SRC             (TIM_DMA_CC1)           // 定时器DMA通道
#define     WS2812B_DMA_TCIF            (DMA1_FLAG_TC6)         // DMA传输完成标志位

/* RGB888格式部分颜色定义 */
#define     RGB888_RED          (0xFF0000)  // 纯红色
#define     RGB888_GREEN        (0x00FF00)  // 纯绿色
#define     RGB888_BLUE         (0x0000FF)  // 纯蓝色
#define     RGB888_YELLOW       (0xFFFF00)  // 纯黄色
#define     RGB888_CYAN         (0x00FFFF)  // 纯青色
#define     RGB888_MAGENTA      (0xFF00FF)  // 纯品红色
#define     RGB888_WHITE        (0xFFFFFF)  // 纯白色
#define     RGB888_BLACK        (0x000000)  // 纯黑色
#define     RGB888_GRAY         (0x808080)  // 灰色
#define     RGB888_LIGHT_GRAY   (0xD3D3D3)  // 浅灰色
#define     RGB888_DARK_GRAY    (0x404040)  // 深灰色
#define     RGB888_ORANGE       (0xFFA500)  // 橙色
#define     RGB888_PURPLE       (0x800080)  // 紫色
#define     RGB888_PINK         (0xFFC0CB)  // 粉色
#define     RGB888_BROWN        (0xA52A2A)  // 棕色
#define     RGB888_LIME         (0x00FF00)  // 酸橙色
#define     RGB888_TEAL         (0x008080)  // 青绿色
#define     RGB888_SILVER       (0xC0C0C0)  // 银色
#define     RGB888_GOLD         (0xFFD700)  // 金色

/* WS2812B灯珠颜色共用体 */
typedef union {
	struct {
		uint8_t b;  // 低8位
		uint8_t g;  // 中8位
        uint8_t r;  // 高8位
	} b;
	uint32_t rgb;
} ws2812b_color_t;

void    WS2812B_Init        (void);
void    WS2812B_Update      (void);
void    WS2812B_SetColor    (int16_t idx, uint32_t color, uint8_t lum, uint8_t cover);
void    WS2812B_ClearColor  (int16_t idx);
void    WS2812B_Test        (void);

#endif
